home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok87 / rekursionen / wirth.mod < prev    next >
Text File  |  1993-11-04  |  3KB  |  104 lines

  1. (*------------------------------------------------------------------------------
  2.      :Program.    Wirth.mod
  3.      :Contents.   zeichnet (rekursiv) die WIRTH-Kurven 
  4.      :Author.     Matthias Scherrer
  5.      :Address.    Baselstrasse 63, CH-4242 Laufen
  6.      :Phone.      ++(0)61/7613975
  7.      :Copyright.  PD
  8.      :Language.   Oberon
  9.      :Translator. Oberon V3.00d
  10.      :History.    V1.0,01-Dec-92  fuer Oberon 2.14d
  11.      :History.    V1.1,29-Dec-92  angepasst an Oberon V3.00d
  12. ------------------------------------------------------------------------------*)
  13. MODULE Wirth;
  14.  
  15. IMPORT  di : Display, io, Mouse;
  16.  
  17. TYPE WinkArr = ARRAY 2,4 OF INTEGER;
  18.  
  19. CONST 
  20.   wt     = WinkArr ( 3, 0, 1, 2, 1, 2, 3, 0);
  21.   height = 480;
  22.   width  = 710;
  23.  
  24. VAR
  25.   screen      : di.ScreenPtr;
  26.   retbo       : BOOLEAN;
  27.   la,ti       : INTEGER;
  28.  
  29. (*------------------------------------------------------------*)
  30. (*                       Screen oeffnen                       *)
  31. (*------------------------------------------------------------*)
  32.  
  33. PROCEDURE InitGraph;
  34. VAR
  35. BEGIN
  36.   NEW(screen);
  37.   retbo:=di.OpenScreen(screen,"Wirth-Kurven",0,0,width,height,1,TRUE,TRUE);
  38. END InitGraph;
  39.  
  40. (*------------------------------------------------------------*)
  41. (*                     Screen schliessen                      *)
  42. (*------------------------------------------------------------*)
  43. PROCEDURE Close; (* Screen schliessen und Speicher freigeben *)
  44. BEGIN 
  45.   di.Close(screen); 
  46.   (* $IFNOT GarbageCollector *)
  47.     DISPOSE(screen);
  48.   (* $END *)
  49. END Close;
  50.  
  51.  
  52. (*------------------------------------------------------------*)
  53. (*  Zeichnet Linien mit der Laenge l:                         *)
  54. (*  Winkel wi:     0      1       2         3                 *)
  55. (*                                                            *)
  56. (*                 A     <--      |        -->                *)
  57. (*                 |              V                           *)
  58. (*------------------------------------------------------------*)
  59. PROCEDURE F(l,wi : INTEGER);
  60. BEGIN
  61.   CASE wi OF
  62.        0 : di.Draw(screen, screen.rp.x   , screen.rp.y-l );
  63.      | 1 : di.Draw(screen, screen.rp.x-l , screen.rp.y   );
  64.      | 2 : di.Draw(screen, screen.rp.x   , screen.rp.y+l );
  65.      | 3 : di.Draw(screen, screen.rp.x+l , screen.rp.y   );
  66.   END
  67. END F;
  68.  
  69.  
  70. (*------------------------------------------------------------*)
  71. (*                  Der rekursive Teil                        *)
  72. (*------------------------------------------------------------*)
  73. PROCEDURE Draw(n,l,wi : INTEGER);
  74. BEGIN
  75.   IF n>0 THEN 
  76.     Draw(n-1,l,wi); F(l,wi); Draw(n-1,l,wt[0,wi]); 
  77.     F(l,wt[1,wi]); F(l,wi);
  78.     Draw(n-1,l,wt[1,wi]); F(l,wt[1,wi]); Draw(n-1,l,wi);
  79.   END;
  80. END Draw;
  81.  
  82.  
  83. (*------------------------------------------------------------*)
  84. (*               Und noch das Hauptprogramm...                *)
  85. (*------------------------------------------------------------*)
  86.  
  87. BEGIN
  88.   io.WriteString("\nLaenge : "); retbo:=io.ReadInteger(la);
  89.   io.WriteString("\nTiefe  : "); retbo:=io.ReadInteger(ti); 
  90.   io.WriteLn;
  91.  
  92.   InitGraph; 
  93.   di.Move(screen,la+3,height-3-la);
  94.  
  95.   Draw(ti,la,3);       (* 1. Haelfte zeichnen *)
  96.   F(la,1); F(la,0);    (* Ecke rechts oben    *)
  97.   Draw(ti,la,1);       (* 2. Haelfte zeichnen *)
  98.   F(la,3); F(la,2);    (* Ecke links unten    *)
  99.  
  100.   Mouse.WaitLMB;
  101.  
  102.   Close;
  103. END Wirth.
  104.